package com.study.designpatterns.strategy;


import com.study.designpatterns.strategy.behavior.Fly;
import com.study.designpatterns.strategy.behavior.Quack;
import lombok.Getter;

/**
 * @author: jzhou
 * @date: 2025/6/14-21:32
 * @version: 1.0

 *
 *   初步观察设计：
     * 已知的鸭子种类有：野鸭（Mallard Duck）、红头鸭（Redhead Duck）、橡皮鸭（Rubber Duck）。
     * 已知的鸭子行为有：游泳（Swim）、嘎嘎叫（Quack）、显示鸭子的样子（Display）。
 *  Change：
     * 我们知道软件开发的一个不变的真理是：“变化”！
     * 现在要求增加一种鸭子行为：飞行（Fly），该怎么做呢？
     * 如果继续使用继承，那么橡皮鸭是不会飞行的，还是需要重写fly()方法。
     * 那如果再增加一种鸭子：诱饵鸭（Decoy Duck），这是只木头鸭子，它即不会叫，也不会飞行......  看来继承是不能满足需求了！
 *  修改实现
     *  将fly()方法和quack()抽离出来，做成接口，让拥有该行为的鸭子对其进行实现。
     *  这似乎解决了现在的问题！但如果再增加100只鸭子呢？岂不是所有会飞行或会叫的鸭子，都要实现一遍，没有达到代码的复用性。
 *  Solution： 上策略模式  找出应用中可能需要变化之处，把它们独立出来，不要和那些不需要变化的代码混在一起。
 *
 *  本次案例中的 Duck 相当于上下文
 */
@Getter
public abstract class Duck {

    Fly fly;
    Quack quack;

    public abstract void display();

    public void swim() {
        System.out.println("正在游泳...");
    }

}
